package com.fan.handler;

import com.fan.utils.CipherUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
 * 自定义类型处理器，用于处理数据库中存储的加密数据  暂时没有用
 * @author fan
 **/
@MappedTypes(String.class)
@MappedJdbcTypes(JdbcType.VARCHAR)
public class EncryptionTypeHandler extends BaseTypeHandler<String> {

    private static final Logger log = LoggerFactory.getLogger(EncryptionTypeHandler.class);

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        // 加密处理
        String encryptedText = CipherUtil.symmetricEncrypt(parameter);
        ps.setString(i, encryptedText);
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String encryptedText = rs.getString(columnName);
        return decryptIfEncrypted(encryptedText);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String encryptedText = rs.getString(columnIndex);
        return decryptIfEncrypted(encryptedText);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String encryptedText = cs.getString(columnIndex);
        return decryptIfEncrypted(encryptedText);
    }

    /**
     * 如果是加密数据则解密，否则返回原文
     * @param text 可能的加密文本
     * @return 解密后的明文或原文
     */
    private String decryptIfEncrypted(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }

        // 检查是否为加密数据
        if (text.startsWith(CipherUtil.START_ENCRYPTED_DATA)) {
            try {
                return CipherUtil.symmetricDecrypt(text);
            } catch (Exception e) {
                log.warn("解密失败，返回原始值: {}", text, e);
                return text;
            }
        }

        return text;
    }
}